# encoding: UTF-8

unless Kernel.respond_to?(:require_relative)
  module Kernel
    def require_relative(path)
      desired_path = File.expand_path('../' + path.to_str, caller[0])
      shortest = desired_path
      $:.each do |path|
        path += '/'
        if desired_path.index(path) == 0
          candidate = desired_path.sub(path, '')
          shortest = candidate if candidate.size < shortest.size
        end
      end
      require shortest
    end
  end
end


require_relative './model/moderador'
require_relative './model/insulto'
require_relative './model/criterio_de_insultos'
require_relative './model/resultado'
require_relative './model/secuencia_fonetica'
require_relative './model/analizador_fonetico'
require_relative './model/preprocesador_espacios'
require_relative './model/preprocesador_excepciones'
require_relative './model/preprocesador_minuscula'
require_relative './model/preprocesador_repeticiones'
require_relative './model/preprocesador_tildes'
require_relative './model/preprocesador_caracteres_mudos'
require_relative './model/estrategia_de_reemplazo'

module Context

  @excepciones = [
    'computacion',
    'diputados',
    'pelo'
  ]

  #El orden es importante
  @preprocesadores = [
    PreprocesadorDeEliminadorDeTildes.new,
    PreprocesadorDePasarAMinuscula.new,
    PreprocesadorDeBorradoDeRepeticiones.new,
    PreprocesadorDeBorradoDeCaracteresMudos.new,
    PreprocesadorDeBorradoDeExcepciones.new(@excepciones),
    PreprocesadorDeBorradoDeEspacios.new
  ]

  @estrategias_de_reemplazo = [
    EstrategiaDeReemplazo.new("typos", [
        Reemplazo.new('b', 'v'),
        Reemplazo.new('v', 'b'),
    ]),
    EstrategiaDeReemplazo.new("similitud gráfica", [
        Reemplazo.new('1', 'l'),
        Reemplazo.new('0', 'o'),
        Reemplazo.new('4', 'a'),
        Reemplazo.new('3', 'e'),
        Reemplazo.new('7', 't'),
    ]),
    EstrategiaDeReemplazo.new("pronunciación del símbolo", [
        Reemplazo.new('2', 'dos'),
    ]),
  ]

  @criterio_de_insultos = CriterioDeInsultosFijo.new([
    Insulto.new("pelotudo", "pelotud"),
    Insulto.new("puto", "put"),
    Insulto.new("boludo", "bolud"),
    Insulto.new("forro", "forr"),
    Insulto.new("tarado", "tarad"),
    Insulto.new("bobo", "bob"),
    Insulto.new("baboso", "babos"),
    Insulto.new("estupido", "estupid"),
    Insulto.new("idiota", "idiot"),
    Insulto.new("maricon", "maric")

  ])

  @analizador_fonetico = AnalizadorFonetico.new(@preprocesadores, @estrategias_de_reemplazo)

  @moderador = Moderador.new(@criterio_de_insultos, @analizador_fonetico)

  def self.moderador
    @moderador
  end

  def self.excepciones
    @excepciones
  end

end
